package cn.uin.domain.shared.adapter.repository;

import java.util.List;
import java.util.function.Function;

/**
 * @ClassName Page
 * @Description:分页结果接口(包含分页元数据和实际数据内容)
 * @Author: Administrator
 * @CreateDate: 2025/11/14 16:53
 * @Version: 1.0
 */
public interface IPage<T> {

	/**
	 * 获取总页数
	 * @return 总页数
	 */
	int getTotalPages();

	/**
	 * 获取总记录数
	 * @return 总记录数
	 */
	long getTotalElements();

	/**
	 * 获取当前页码（从0开始）
	 * @return 当前页码
	 */
	int getNumber();

	/**
	 * 获取每页大小
	 * @return 每页记录数
	 */
	int getSize();

	/**
	 * 获取当前页的实际记录数
	 * @return 当前页记录数
	 */
	int getNumberOfElements();

	/**
	 * 获取当前页的数据内容
	 * @return 不可修改的数据列表
	 */
	List<T> getContent();

	/**
	 * 检查当前页是否有数据
	 * @return 如果有数据返回true，否则返回false
	 */
	boolean hasContent();

	/**
	 * 获取排序信息
	 * @return 排序对象
	 */
	ISort getSort();

	/**
	 * 检查是否是第一页
	 * @return 如果是第一页返回true，否则返回false
	 */
	boolean isFirst();

	/**
	 * 检查是否是最后一页
	 * @return 如果是最后一页返回true，否则返回false
	 */
	boolean isLast();

	/**
	 * 检查是否有下一页
	 * @return 如果有下一页返回true，否则返回false
	 */
	boolean hasNext();

	/**
	 * 检查是否有上一页
	 * @return 如果有上一页返回true，否则返回false
	 */
	boolean hasPrevious();

	/**
	 * 获取下一页的分页信息
	 * @return 下一页的Pageable对象
	 */
	IPageable nextPageable();

	/**
	 * 获取上一页的分页信息
	 * @return 上一页的Pageable对象
	 */
	IPageable previousPageable();

	/**
	 * 将分页内容转换为另一种类型
	 * @param converter 转换函数
	 * @param <U> 目标类型
	 * @return 转换后的分页对象
	 */
	<U> IPage<U> map(Function<? super T, ? extends U> converter);

}
